31 インヘリタンス(相続)税
Tip 51 インヘリタンス(相続)税を払わないこと
継承を使うなと言っていると理解した
背景:2種類の継承
Simula 67
型を結合する手段として継承を捉えるSimulaのアプローチは、C++やJavaといった言語に受け継がれました。(Kindle の位置No.4776-4777)
Smalltalk(Alan Kay)
振る舞いの動的な組織化として継承を捉えるSmalltalk流は、RubyやJavaScriptに受け継がれています。(Kindle の位置No.4777-4778)
問題のある継承 2つ
差分プログラミング(共通機能を持った基底クラスを継承して、入力を節約)
継承は結合
親クラスのAPIの変更によって小クラスは壊れる
is-aによる型の関係の表現
クラス階層図はどんどん階層を呼ぶ(図を参照)
多重継承
3つの優れた代替テクニック
インターフェースとプロトコル
継承を型情報の共有で使いたい場合に、代わりに使うのがオススメ
1つ以上の振る舞いの集合を実装するクラスの定義 (Kindle の位置No.4834)
Javaではinterface(implementsする)
複数implementsできる!
IMO:Pythonはプロトコルの例に該当
メソッドを実装する必要があると述べているにすぎない
Tip 52 ポリモーフィズムの表現にはインターフェースを愛用すること
委譲
継承を機能の追加で使いたい場合に、代わりに使うのがオススメ
継承すると大量のメソッドができて親クラスと結合する
子クラスで使いたいのはそのうちの一部だけ
子クラスユーザには全部のメソッドが見える
委譲では不要なAPI(メソッド)をユーザに見せずに済む
Tip 53 サービスに委譲すること:has-aはis-aに勝る
mixinとtrait
継承を手段の共有で使いたい場合に、代わりに使うのがオススメ
(IMO:Pythonにはなさそう。mixinクラスの多重継承なので)
基本的な考え方は、継承を使用することなく、クラスやオブジェクトに新しい機能を追加したい (Kindle の位置No.4915-4916)
機能一式を作成してそれに名前を付け、クラスやオブジェクトに何らかの方法で追加する (Kindle の位置No.4916-4917)
mixin=混ぜ合わせ
例:検索手法のmixinと永続化のmixinを作り、それを追加
例:ユーザアカウントと管理者アカウント、検証のmixinが3つあり、組み合わせて持つ
Tip 54 機能の共有にはmixinを使用する
まとめでは手段の共有